springboot jpa批量新增、更新、删除、查询数据 |
您所在的位置:网站首页 › jpa 批量保存主键 › springboot jpa批量新增、更新、删除、查询数据 |
文章目录
1 新增2 修改3 删除4 查询分页
springboot jpa使用:写一个dao层,定义一个接口
// PersonDao.java
@Repository
public interface PersonDao extends JpaRepository, JpaSpecificationExecutor{
}
在controller层注入,并调用即可 在dao接口中,可以通过jpa的条件构建规则来写一个方法,也可以自定义sql,通常构建规则只能解决简单的需求,复杂的需求还是需要手动写sql来实现。(称作JPQL语句,注意JPQL不支持insert操作) @Modifying @Transactional @Query("update CityStationGoods csg set csg.isOnsale = ?2 where csg.id = ?1",nativeQuery=false) // @Query("update city_station_goods csg set csg.is_on_sale = ?2 where csg.id = ?1",nativeQuery=true) int updateOnSaleState(int id, Boolean isOnsale);注意:@Modifying表示除查询外的操作,即对数据库数据有更改。@Transactional表示事务,如果是变更操作需要开启事务才行(该注解可以写在Service或Repository中),@Query的value指定sql,nativeQuery=true表示使用数据库查询,即数据库中表:city_station_goods,否则为本地查询,即使用映射后的实体类作为查询对象,本地PO实体:CityStationGoods。 sql中的参数有两种写法: 使用占位符:?1,依据参数顺序从1到n使用命名参数::name,相应的方法中的参数需要加上注解:@Param("name") String name, 1 新增调用继承过来的方法方法:save()或者saveAll(),传入一个实体或者实体列表进行保存 2 修改直接编辑SQL 3 删除默认的删除方法有: delete(实体),只能传入一个可以对应到数据库的实体,即数据库中存在一样的数据的实体deleteInBatch(实体的迭代器),传入一个实体列表,实体同上,在一个语句中进行删除,使用or拼接id(where id=? or id=?..)deleteAll(),删除所有数据项,不过是一条一条删除,会先查询所有项,再删除deleteAll(实体的迭代器),删除所有传入的实体,一条一条删除,deleteAllInBatch(),删除所有数据,一条语句中拼接id删除,同样会先查询出所有的,再删除deleteById(String id),根据id删除某一条数据项我的需求是根据某个条件删除符合该条件的所有数据项,如果使用默认方法,需要先查询到所有符合的数据项,然后传给删除方法,但是,查询出所有数据项的所有字段增加了网络传输,降低了效率,实际上只需要查出符合条件的id列表即可定位数据项。然后需要批量删除。这个需求只能自己写sql: // PersonDao.java @Repository public interface PersonDao extends JpaRepository, JpaSpecificationExecutor{ @Query(value="select id from tb_person where age>?1 limit 0,?2",nativeQuery=true) List findId(int age,int num); @Transactional @Modifying @Query(value="delete from tb_person where id in ?1",nativeQuery=true) int deleteInIds(List ids); }注意:如果查询出来的数据字段不是全部,则返回值如果写成List可能会报错,如果删除数据过多,建议分批次删除,即查询的时候限制数量,多次查询多次删除。 4 查询查询可以使用方法命名规则,也可以使用sql来查询,如果是多条件查询,可以使用:Specification 命名规则: 使用Specification: // 新建一个Specification对象,用于组装条件 Specification spec = new Specification(){ @override public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder criteriaBuilder) { List pList = new ArrayList(); if(StringUtils.isNotEmpty(name)){ pList.add(criteriaBuilder.like(root.get("name").as(String.class), "%"+name+"%")); } if(StringUtils.isNotEmpty(code)){ pList.add(criteriaBuilder.equal(root.get("name").as(String.class), code)); } Predicate[] p = new Predicate[pList.size()]; return criteriaBuilder.and(pList.toArray(p)); } }; Page all = personDao.findAll(spec,PageRequest.of(pageNum,pageSize)); int dataList = all.getContent(); // 获取所有数据 int num = all.getTotalElements(); // 获取所有记录数注意:如果多条件查询中,既有and又有or:criteriaQuery.where(predicateAnd,predicateOR).getRestriction()返回一个组合predicate 分页分页功能实现需要继承JpaRepository 调用:personDao.findAll(PageRequest.of(pageNum,pageSize))即可 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |